```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深入理解高可用系统架构 - Redis高可用方案解析</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background-color: #f9fafb;
            color: #1a1a1a;
            line-height: 1.6;
        }
        .hero-gradient {
            background: linear-gradient(135deg, #6e45e2 0%, #88d3ce 100%);
        }
        .card-hover {
            transition: all 0.3s ease;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
        }
        .card-hover:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.15);
        }
        .section-title {
            position: relative;
            padding-bottom: 0.5rem;
        }
        .section-title:after {
            content: '';
            position: absolute;
            bottom: 0;
            left: 0;
            width: 60px;
            height: 3px;
            background: linear-gradient(90deg, #6e45e2 0%, #88d3ce 100%);
            border-radius: 3px;
        }
        .code-block {
            background-color: #2d2d2d;
            color: #f8f8f2;
            border-radius: 8px;
            overflow: hidden;
        }
        .highlight-text {
            background: linear-gradient(90deg, #6e45e2 0%, #88d3ce 100%);
            -webkit-background-clip: text;
            background-clip: text;
            color: transparent;
            font-weight: 600;
        }
        .step-card {
            counter-increment: step-counter;
            position: relative;
            padding-left: 3.5rem;
        }
        .step-card:before {
            content: counter(step-counter);
            position: absolute;
            left: 0;
            top: 0;
            background: linear-gradient(135deg, #6e45e2 0%, #88d3ce 100%);
            color: white;
            width: 2.5rem;
            height: 2.5rem;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: bold;
            font-size: 1.2rem;
        }
        .diagram-container {
            background-color: white;
            border-radius: 12px;
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
            overflow: hidden;
        }
    </style>
</head>
<body class="antialiased">
    <!-- Hero Section -->
    <section class="hero-gradient text-white py-20 md:py-32 px-4 md:px-0">
        <div class="container mx-auto max-w-5xl px-4">
            <div class="flex flex-col md:flex-row items-center">
                <div class="md:w-1/2 mb-10 md:mb-0">
                    <h1 class="text-4xl md:text-5xl font-bold mb-4 leading-tight">Redis高可用架构解密</h1>
                    <p class="text-xl md:text-2xl mb-6 opacity-90">探索分布式系统99.99%可用性的实现之道</p>
                    <div class="flex items-center space-x-3">
                        <div class="w-12 h-1 bg-white opacity-50"></div>
                        <span class="text-sm opacity-70">深入解析主从复制、哨兵模式与集群架构</span>
                    </div>
                </div>
                <div class="md:w-1/2 flex justify-center">
                    <div class="relative w-64 h-64 md:w-80 md:h-80 bg-white bg-opacity-20 rounded-full flex items-center justify-center">
                        <div class="absolute w-3/4 h-3/4 bg-white bg-opacity-10 rounded-full"></div>
                        <div class="absolute w-1/2 h-1/2 bg-white bg-opacity-10 rounded-full"></div>
                        <i class="fas fa-server text-6xl md:text-7xl opacity-80 relative z-10"></i>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <!-- Main Content -->
    <div class="container mx-auto max-w-5xl px-4 py-12 md:py-16">
        <!-- What is High Availability -->
        <section class="mb-20">
            <div class="flex items-center mb-8">
                <i class="fas fa-shield-alt text-2xl text-indigo-500 mr-3"></i>
                <h2 class="section-title text-3xl font-bold">什么是高可用</h2>
            </div>
            <div class="grid md:grid-cols-2 gap-8">
                <div>
                    <p class="text-lg mb-6">高可用HA（High Availability）是分布式系统架构设计中必须考虑的因素之一，它通常是指，通过设计减少系统不能提供服务的时间。</p>
                    <div class="bg-white p-6 rounded-xl card-hover">
                        <h3 class="text-xl font-semibold mb-4 flex items-center">
                            <i class="fas fa-percentage text-indigo-500 mr-2"></i>
                            <span class="highlight-text">可用性指标</span>
                        </h3>
                        <p>假设系统一直能够提供服务，我们说系统的可用性是100%。如果系统每运行100个时间单位，会有1个时间单位无法提供服务，我们说系统的可用性是99%。</p>
                        <div class="mt-4 p-4 bg-gray-50 rounded-lg">
                            <p class="font-medium">很多公司的高可用目标是4个9，也就是99.99%，这就意味着，系统的年停机时间为52.56分钟。</p>
                        </div>
                    </div>
                </div>
                <div>
                    <div class="bg-white p-6 rounded-xl card-hover h-full">
                        <div class="mermaid diagram-container p-4">
                            pie
                                title 系统可用性时间分布
                                "可用时间 99.99%" : 99.99
                                "停机时间 0.01%" : 0.01
                        </div>
                        <p class="mt-4 text-center font-medium text-gray-700">在全年的时间中，如果服务在99.99%的时间内是正常提供服务的，这就是高可用。</p>
                    </div>
                </div>
            </div>
        </section>

        <!-- Master-Slave Mode -->
        <section class="mb-20">
            <div class="flex items-center mb-8">
                <i class="fas fa-sitemap text-2xl text-blue-500 mr-3"></i>
                <h2 class="section-title text-3xl font-bold">主从模式</h2>
            </div>
            <div class="grid md:grid-cols-2 gap-8 mb-10">
                <div>
                    <p class="text-lg mb-6">Redis通过主从复制实现数据的备份和高可用。一个Redis主节点可以有多个从节点，主节点将写操作同步给从节点，从而保证数据的一致性。当主节点发生故障时，从节点可以被提升为新的主节点，确保系统的可用性。</p>
                </div>
                <div>
                    <div class="bg-white p-4 rounded-xl card-hover h-full">
                        <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1705386537051-1dc5bde6-e5dd-42f8-926b-d691136521c8.png" alt="Redis主从模式" class="rounded-lg w-full">
                    </div>
                </div>
            </div>

            <div class="grid md:grid-cols-2 gap-8">
                <div class="bg-white p-6 rounded-xl card-hover">
                    <h3 class="text-xl font-semibold mb-4 flex items-center">
                        <i class="fas fa-sync-alt text-blue-500 mr-2"></i>
                        <span class="highlight-text">全量同步</span>
                    </h3>
                    <p class="mb-4">Redis全量复制一般发生在Slave初始化阶段，这时Slave需要将Master上的所有数据都复制一份。</p>
                    <div class="space-y-4">
                        <div class="step-card">
                            <p>从服务器连接主服务器，发送SYNC命令</p>
                        </div>
                        <div class="step-card">
                            <p>主服务器接收到SYNC命名后，开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令</p>
                        </div>
                        <div class="step-card">
                            <p>主服务器BGSAVE执行完后，向所有从服务器发送快照文件，并在发送期间继续记录被执行的写命令</p>
                        </div>
                        <div class="step-card">
                            <p>从服务器收到快照文件后丢弃所有旧数据，载入收到的快照</p>
                        </div>
                        <div class="step-card">
                            <p>主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令</p>
                        </div>
                        <div class="step-card">
                            <p>从服务器完成对快照的载入，开始接收命令请求，并执行来自主服务器缓冲区的写命令</p>
                        </div>
                    </div>
                </div>
                <div class="bg-white p-6 rounded-xl card-hover">
                    <h3 class="text-xl font-semibold mb-4 flex items-center">
                        <i class="fas fa-exchange-alt text-blue-500 mr-2"></i>
                        <span class="highlight-text">增量同步</span>
                    </h3>
                    <p class="mb-4">Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。</p>
                    <div class="bg-blue-50 p-4 rounded-lg">
                        <p class="font-medium">增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令，从服务器接收并执行收到的写命令。</p>
                    </div>
                    <p class="mt-4">增量同步就是当 master 服务器有数据更新的时候，会立刻同步到所有的 slave 服务器。</p>
                </div>
            </div>
        </section>

        <!-- Sentinel Mode -->
        <section class="mb-20">
            <div class="flex items-center mb-8">
                <i class="fas fa-user-shield text-2xl text-purple-500 mr-3"></i>
                <h2 class="section-title text-3xl font-bold">哨兵模式</h2>
            </div>
            <div class="grid md:grid-cols-2 gap-8 mb-10">
                <div>
                    <p class="text-lg mb-6">哨兵模式是一个用于监控和管理Redis集群的系统。它可以自动检测主节点的故障，并进行自动故障转移。当主节点不可用时，Sentinel会选出一个从节点作为新的主节点，保证系统的连续性。</p>
                </div>
                <div>
                    <div class="bg-white p-4 rounded-xl card-hover h-full">
                        <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1705386670513-fa930b57-676d-4dd7-9bee-55266fe6f778.png" alt="Redis哨兵模式" class="rounded-lg w-full">
                    </div>
                </div>
            </div>

            <div class="bg-white p-6 rounded-xl card-hover">
                <h3 class="text-xl font-semibold mb-4 flex items-center">
                    <i class="fas fa-vote-yea text-purple-500 mr-2"></i>
                    <span class="highlight-text">Master宕机后，应该选择哪个Slave作为主节点？</span>
                </h3>
                <div class="code-block p-4 rounded-lg mb-6">
                    <pre class="text-sm md:text-base overflow-x-auto">a) 从哨兵中选举leader
    1) 单台哨兵认为主节点宕机了是主观下线
    2) 一半以上哨兵认为主节点宕机后是客观下线
        a) 哨兵之间投票(认为主观下线的哨兵会发请求给其他的哨兵，把票投给发消息的哨兵,
           如果此时该哨兵已经投票给其他的哨兵次票数作废)
        b) 票数过半的哨兵成为哨兵中的leader
b) 从节点中选举leader
    1) 此时的Slave由哨兵的leader来选举
    2) 选举偏移量(决定了数据的最新程度)最大的从节点作为主节点，不过不存在则继续
    3) 选举优先级(slave-priority)最大的从节点作为主节点,如不存在则继续
    4) 选择runid（redis每次启动的时候生成随机的runid作为redis的标识）
       最小的从节点作为主节点</pre>
                </div>
                <div class="mermaid diagram-container p-4">
                    graph TD
                        A[Master宕机] --> B[哨兵检测故障]
                        B --> C{主观下线?}
                        C -->|是| D[通知其他哨兵]
                        C -->|否| B
                        D --> E{超过半数哨兵确认?}
                        E -->|是| F[客观下线]
                        E -->|否| B
                        F --> G[选举哨兵Leader]
                        G --> H[选举新Master]
                        H --> I[通知其他节点]
                </div>
            </div>
        </section>

        <!-- Cluster Mode -->
        <section class="mb-20">
            <div class="flex items-center mb-8">
                <i class="fas fa-network-wired text-2xl text-teal-500 mr-3"></i>
                <h2 class="section-title text-3xl font-bold">Redis Cluster模式</h2>
            </div>
            <div class="grid md:grid-cols-2 gap-8">
                <div>
                    <p class="text-lg mb-6">Redis Cluster 模式提供的一种分布式部署模式，用于提高系统的可扩展性和高可用性。它将数据分散存储在多个节点上，每个节点负责存储部分数据，使得整个系统可以处理更大的数据量。每个槽位（slot）都有一个主节点和一个或多个从节点，当主节点故障时，系统可以自动选举从节点升级为主节点，确保数据的可用性。</p>
                    <div class="bg-white p-6 rounded-xl card-hover mt-6">
                        <h3 class="text-xl font-semibold mb-4 flex items-center">
                            <i class="fas fa-key text-teal-500 mr-2"></i>
                            <span class="highlight-text">核心特性</span>
                        </h3>
                        <ul class="space-y-3">
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-teal-500 mt-1 mr-2"></i>
                                <span>使用哈希槽（hash slot）来分片数据</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-teal-500 mt-1 mr-2"></i>
                                <span>不依赖中心节点，每个节点都是平等的</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-teal-500 mt-1 mr-2"></i>
                                <span>通过增加节点实现横向扩展</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-check-circle text-teal-500 mt-1 mr-2"></i>
                                <span>自动的故障检测和故障转移</span>
                            </li>
                        </ul>
                    </div>
                </div>
                <div>
                    <div class="bg-white p-4 rounded-xl card-hover h-full">
                        <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1705387599157-df42f090-4949-4471-b119-e48203d85d77.png" alt="Redis Cluster模式" class="rounded-lg w-full">
                    </div>
                </div>
            </div>

            <div class="bg-white p-6 rounded-xl card-hover mt-8">
                <h3 class="text-xl font-semibold mb-4 flex items-center">
                    <i class="fas fa-cogs text-teal-500 mr-2"></i>
                    <span class="highlight-text">工作原理</span>
                </h3>
                <div class="grid md:grid-cols-2 gap-6">
                    <div>
                        <div class="flex items-start mb-4">
                            <div class="bg-teal-100 text-teal-800 rounded-full w-8 h-8 flex items-center justify-center flex-shrink-0 mr-3">
                                <i class="fas fa-hashtag"></i>
                            </div>
                            <div>
                                <h4 class="font-semibold">哈希槽分片</h4>
                                <p class="text-gray-600">Redis Cluster 将数据分为 16384 个哈希槽。每个节点负责处理其中的一部分槽位。</p>
                            </div>
                        </div>
                        <div class="flex items-start mb-4">
                            <div class="bg-teal-100 text-teal-800 rounded-full w-8 h-8 flex items-center justify-center flex-shrink-0 mr-3">
                                <i class="fas fa-search"></i>
                            </div>
                            <div>
                                <h4 class="font-semibold">节点发现</h4>
                                <p class="text-gray-600">客户端可以通过访问任意一个节点，获取整个集群的拓扑信息，从而发现其他节点。</p>
                            </div>
                        </div>
                        <div class="flex items-start">
                            <div class="bg-teal-100 text-teal-800 rounded-full w-8 h-8 flex items-center justify-center flex-shrink-0 mr-3">
                                <i class="fas fa-comments"></i>
                            </div>
                            <div>
                                <h4 class="font-semibold">节点间通信</h4>
                                <p class="text-gray-600">节点之间通过 gossip 协议进行通信，用于维护集群的拓扑信息。</p>
                            </div>
                        </div>
                    </div>
                    <div>
                        <div class="flex items-start mb-4">
                            <div class="bg-teal-100 text-teal-800 rounded-full w-8 h-8 flex items-center justify-center flex-shrink-0 mr-3">
                                <i class="fas fa-copy"></i>
                            </div>
                            <div>
                                <h4 class="font-semibold">主从复制</h4>
                                <p class="text-gray-600">每个槽位都有一个主节点和零个或多个从节点。主节点负责处理写操作，从节点负责处理读操作。</p>
                            </div>
                        </div>
                        <div class="flex items-start mb-4">
                            <div class="bg-teal-100 text-teal-800 rounded-full w-8 h-8 flex items-center justify-center flex-shrink-0 mr-3">
                                <i class="fas fa-medkit"></i>
                            </div>
                            <div>
                                <h4 class="font-semibold">故障转移</h4>
                                <p class="text-gray-600">当主节点故障时，Redis Cluster 会自动进行故障转移，选举一个从节点升级为主节点。</p>
                            </div>
                        </div>
                        <div class="flex items-start">
                            <div class="bg-teal-100 text-teal-800 rounded-full w-8 h-8 flex items-center justify-center flex-shrink-0 mr-3">
                                <i class="fas fa-route"></i>
                            </div>
                            <div>
                                <h4 class="font-semibold">客户端路由</h4>
                                <p class="text-gray-600">客户端可以通过计算键的哈希槽，确定应该连接到哪个节点，实现数据的路由。</p>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <!-- Summary -->
        <section class="bg-indigo-50 p-8 rounded-2xl">
            <div class="text-center">
                <h3 class="text-2xl font-bold mb-4 flex items-center justify-center">
                    <i class="fas fa-lightbulb text-indigo-600 mr-2"></i>
                    <span class="highlight-text">关键总结</span>
                </h3>
                <p class="text-lg mb-6">Redis提供了多种高可用解决方案，从简单的主从复制到成熟的Cluster模式，能够满足不同规模系统的需求。选择适合的方案需要权衡复杂性、性能要求和运维成本。</p>
                <div class="grid md:grid-cols-3 gap-6">
                    <div class="bg-white p-4 rounded-lg">
                        <div class="text-indigo-500 text-3xl mb-2">
                            <i class="fas fa-sitemap"></i>
                        </div>
                        <h4 class="font-bold mb-2">主从模式</h4>
                        <p class="text-gray-600">简单易用，适合小规模应用，提供基本的高可用保障</p>
                    </div>
                    <div class="bg-white p-4 rounded-lg">
                        <div class="text-blue-500 text-3xl mb-2">
                            <i class="fas fa-user-shield"></i>
                        </div>
                        <h4 class="font-bold mb-2">哨兵模式</h4>
                        <p class="text-gray-600">自动故障转移，适合中等规模应用，提供监控和自动恢复</p>
                    </div>
                    <div class="bg-white p-4 rounded-lg">
                        <div class="text-teal-500 text-3xl mb-2">
                            <i class="fas fa-network-wired"></i>
                        </div>
                        <h4 class="font-bold mb-2">Cluster模式</h4>
                        <p class="text-gray-600">分布式架构，适合大规模应用，提供横向扩展和自动分片</p>
                    </div>
                </div>
            </div>
        </section>
    </div>

    <!-- Footer -->
    <footer class="bg-gray-900 text-white py-8">
        <div class="container mx-auto px-4 max-w-5xl">
            <div class="flex flex-col md:flex-row justify-between items-center">
                <div class="mb-4 md:mb-0">
                    <h3 class="text-xl font-bold">技术小馆</h3>
                    <p class="text-gray-400 mt-1">探索技术的无限可能</p>
                </div>
                <div>
                    <a href="http://www.yuque.com/jtostring" class="text-gray-300 hover:text-white transition-colors duration-200 flex items-center">
                        <i class="fas fa-external-link-alt mr-2"></i>
                        <span>访问技术小馆</span>
                    </a>
                </div>
            </div>
            <div class="border-t border-gray-800 mt-6 pt-6 text-center text-gray-400 text-sm">
                <p>© 2024 技术小馆. 保留所有权利.</p>
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            },
            themeCSS: `
                .node rect {
                    fill: #fff;
                    stroke: #6e45e2;
                    stroke-width: 2px;
                }
                .node text {
                    font-family: 'Noto Sans SC';
                    fill: #333;
                }
                .edgePath path {
                    stroke: #88d3ce;
                    stroke-width: 2px;
                }
                .pieCircle{
                    stroke: #6e45e2;
                    opacity:0.3;
                }
            `
        });
    </script>
</body>
</html>
```